package com.example.service.storage;

import com.aliyun.oss.OSS;
import com.aliyun.oss.model.PutObjectRequest;
import com.aliyun.oss.model.ObjectMetadata;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;
import java.util.Locale;
import java.util.UUID;

@Slf4j
@Service
public class OssStorageService {

    // Endpoint 与 Bucket 通过配置注入，避免硬编码，便于不同环境切换
    @Value("${oss.endpoint}")
    private String endpoint;

    @Value("${oss.bucket}")
    private String bucket;

    // 用于拼接公网访问域名，优先使用自定义域名；未配置则使用默认 Bucket 域名
    @Value("${oss.domain:}")
    private String domain;

    @Autowired
    private OSS ossClient;

    /**
     * 上传头像文件到 OSS，并返回可直接访问的公网 URL。
     * 核心流程：
     * 1) 计算对象 Key（以 avatars/ 前缀 + 随机 UUID 命名，避免重名覆盖）
     * 2) 构建 ObjectMetadata（设置 ContentType、ContentLength 等，便于浏览器正确识别）
     * 3) 通过 PutObjectRequest 发起上传
     * 4) 根据是否配置自定义域名拼接返回 URL
     */
    public String uploadAvatar(MultipartFile file) throws IOException {
        String originalFilename = file.getOriginalFilename();
        String suffix = "";
        if (originalFilename != null && originalFilename.contains(".")) {
            suffix = originalFilename.substring(originalFilename.lastIndexOf('.'));
        }
        // 以目录前缀区分业务场景，便于后续设置生命周期/访问策略
        String key = "avatars/" + UUID.randomUUID().toString().replace("-", "") + suffix;

        // 设置对象元数据（非常关键：至少指定 ContentType，前端展示才不会当成下载）
        ObjectMetadata metadata = new ObjectMetadata();
        String contentType = file.getContentType();
        if (contentType == null) {
            contentType = "application/octet-stream";
        }
        metadata.setContentType(contentType.toLowerCase(Locale.ROOT));
        metadata.setContentLength(file.getSize());

        // 使用官方推荐的 PutObjectRequest，支持更丰富的上传参数与进度控制
        PutObjectRequest req = new PutObjectRequest(bucket, key, file.getInputStream(), metadata);
        ossClient.putObject(req);

        // 拼接可访问 URL：优先自定义域名/加速域名；否则走默认 {bucket}.{endpoint}
        if (domain != null && !domain.isEmpty()) {
            // 确保 domain 末尾没有 /
            String d = domain.endsWith("/") ? domain.substring(0, domain.length() - 1) : domain;
            return d + "/" + key;
        }
        // 默认 bucket 访问域名（注意：若为私有读，需要改为返回预签名 URL）
        return String.format("https://%s.%s/%s", bucket, endpoint.replaceFirst("^https?://", ""), key);
    }

}
